from file import *
from student import *


def printHead():
    # 打印学生信息表头
    print('-' * 30)
    print('学号\t\t姓名\t\t性别\t\t语文\t\t数学\t\t英语\t\t总分\t\t名次')


def menu():
    # 顶层菜单函数
    print('-' * 30)
    print('1.显示基本信息')
    print('2.基本信息管理')
    print('3.学生成绩管理')
    print('4.考试成绩统计')
    print('5.根据条件查询')
    print('0.退出        ')
    print('-' * 30)


def menuShow():
    # 1.数据展示菜单函数
    print('-' * 30)
    print('1.按学号显示信息')
    print('2.按姓名显示信息')
    print('3.按总分显示信息')
    print('0.返回上层菜单')
    print('-' * 30)


def menuBase():
    # 2.基本信息管理菜单函数
    print('-' * 30)
    print('1.插入学生记录')
    print('2.删除学生记录')
    print('3.修改学生记录')
    print('0.返回上层菜单')
    print('-' * 30)


def menuScore():
    # 3.学生成绩管理菜单函数
    print('-' * 30)
    print('1.计算学生总分')
    print('2.根据总分排名')
    print('0.返回上层菜单')
    print('-' * 30)


def menuCount():
    # 4.考试成绩统计菜单函数
    print('-' * 30)
    print('1.求课程最高分')
    print('2.求课程最低分')
    print('3.求课程平均分')
    print('0.返回上层菜单')
    print('-' * 30)


def menuSearch():
    # 5.根据条件查询菜单函数
    print('-' * 30)
    print('1.按学号查询  ')
    print('2.按姓名查询  ')
    print('3.按名次查询  ')
    print('0.返回上层菜单')
    print('-' * 30)


def showManage():
    global stuList
    # 该函数完成数据展示功能，提示用户按照学号、姓名、总分排名展示数据
    while True:
        menuShow()
        choice = input("请输入您的选择（0-3）：")
        if choice == '1':
            sortStu(stuList, "学号")
        elif choice == '2':
            sortStu(stuList, "姓名")
        elif choice == '3':
            sortStu(stuList, "总分")
            stuList = stuList[::-1]
        else:
            break
        printHead()
        printStu(stuList)


def baseManage():
    # 该函数完成基本信息管理，按学号进行插入删除修改，学号不能重复
    while True:  # 按学号进行插入删除修改，学号不能重复
        menuBase()  # 显示对应的二级菜单
        choice = input("请输入您的选择（0-3）：")
        if choice == '1':
            readStu(stuList, 1)  # 读入一条待插入的学生记录
        elif choice == '2':
            num = input("请输入需要删除的学生学号：")
            deleteStu(stuList, num)  # 调用函数删除指定学号的学生记录
        elif choice == '3':
            num = input("请输入需要修改的学生学号：")
            found = searchStu(stuList, num, "学号")
            # 调用函数查找指定学号的学生记录
            if found != []:  # 如果该学号的记录存在
                newStu = []
                readStu(newStu, 1)  # 读入一条完整的学生记录信息
                stuList[found[0]] = newStu[0]  # 将刚读入的记录赋值给需要修改的学生记录
            else:
                print("该学生不存在，无法修改其信息！")
        else:
            break


def scoreManage():
    # 该函数完成学生成绩管理功能
    while True:
        menuScore();  # 显示对应的二级菜单
        choice = input("请输入您的选择（0-2）：")
        if choice == '1':
            for stu in stuList:
                stu.calcTotal()
            print("计算所有学生总分完毕！")
        elif choice == '2':
            scores = [stu.getTotal() for stu in stuList]
            for stu in stuList:
                stu.calcRank(scores)
            print("计算所有学生排名完毕！")
        else:
            break


def countManage():
    # 该函数完成考试成绩统计功能
    while True:
        menuCount()  # 显示对应的二级菜单
        choice = input("请输入您的选择（0-3）：")
        if choice == '1':
            print("三门课最高分的同学分别是：")
            print("语文：", max(stuList, key=lambda stu: stu.getScore()["语文"]))
            print("数学：", max(stuList, key=lambda stu: stu.getScore()["数学"]))
            print("英语：", max(stuList, key=lambda stu: stu.getScore()["英语"]))
        elif choice == '2':
            print("三门课最低分的同学分别是：")
            print("语文：", min(stuList, key=lambda stu: stu.getScore()["语文"]))
            print("数学：", min(stuList, key=lambda stu: stu.getScore()["数学"]))
            print("英语：", min(stuList, key=lambda stu: stu.getScore()["英语"]))
        elif choice == '3':
            print("三门课的平均分是：")
            print("语文：", sum([stu.getScore()["语文"] for stu in stuList]) / len(stuList))
            print("数学：", sum([stu.getScore()["数学"] for stu in stuList]) / len(stuList))
            print("英语：", sum([stu.getScore()["英语"] for stu in stuList]) / len(stuList))
        else:
            break


def searchManage():
    # 该函数完成根据条件查询功能
    while True:
        menuSearch()  # 显示对应二级菜单
        choice = input("请输入您的选择（0-3）：")
        if choice == "1":
            keyword, condition = input("请输入待查询学生的学号："), "学号"
        elif choice == "2":
            keyword, condition = input("请输入待查询学生的姓名："), "姓名"
        elif choice == "3":
            keyword, condition = int(input("请输入待查询学生的名次：")), "排名"
        else:
            break
        found = searchStu(stuList, keyword, condition)
        # 查找的符合条件元素的下标存于f列表中
        if found:  # 如果查找成成功
            printHead()  # 打印表头
            for i in found:  # 循环控制f列表的下标
                print(stuList[i])  # 每次输出一条记录
        else:
            print("查找的记录不存在")  # 如果查找不到元素，则输出提示信息


def runMain(choice):
    # 主控模板，对应于下一级菜单其下各功能选择执行
    if choice == '1':
        showManage()  # 1.显示基本信息
    elif choice == '2':
        baseManage()  # 2.基本信息管理
    elif choice == '3':
        scoreManage()  # 3.学生成绩管理
    elif choice == '4':
        countManage()  # 4.考试成绩统计
    elif choice == '5':
        searchManage()  # 5.根据条件查询


if __name__ == "__main__":
    stuList = []  # 定义实参一维列表存储学生记录
    n = readFile(stuList)  # 首先读取文件，记录条数返回赋值给n
    if n == 0:  # 如果原来文件为空
        n = createFile(stuList)  # 则首先要建立文件，从键盘上读入一系列记录存于文件
    print('-' * 30)
    print('欢迎您使用学生成绩管理系统')
    while True:
        menu()  # 显示主菜单
        choice = input("请输入您的选择（0-5）：")
        if choice == '0':
            print("感谢您的使用，再见！")
            saveFile(stuList)
            break  # 退出循环，停止接收用户的输入
        elif '0' < choice <= '5':
            runMain(choice)  # 通过调用此函数进行一级功能项的选择执行
        else:
            print("输入错误，请重新输入！")
